package com.laixu.estore.web.controller;

import com.laixu.estore.bean.pojo.Book;
import com.laixu.estore.bean.vo.BookVo;
import com.laixu.estore.dao.BookDao;
import com.laixu.estore.service.BookService;
import com.laixu.estore.web.response.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

// springmvc 流程
// 如何访问到后端代码
// 1.分发器

// 2.控制器
// 3.适配器
// 4.视图解析器
// 控制器  // @Controller + @ResponseBody 对象->json
@RestController // 前后端分离 json 不返回页面
// @Controller // 前后端不分离 html/jsp 页面
@RequestMapping("/book")
@RequiredArgsConstructor // lombok
//@CrossOrigin // 局部注解
@Slf4j// SLf4j lombok提供的日志对象
@Api(tags = "书籍模块")
public class BookController {

    private final BookDao bookDao;

    private final BookService bookService;

    // 表单数据 PostMan/apifox/apipost
    @PostMapping("/insert")
    public Result insert(@RequestBody Book book) { // json -> 对象
//        int i = 1/0; // 模拟未知异常
        // 1.接收数据
        System.out.println("book = " + book);
        bookService.insert(book);
        return Result.success();
    }

    // localhost:7777/book/findAll
    @GetMapping("/findAll")
    @ApiOperation("查询所有书籍")
    public Result findAll() {
        List<Book> data = bookDao.findAll();
        return Result.success(data);
    }

    @GetMapping("showBooks")
    public Result showBooks() {
        // 如果该方法没有调用，说明不是后端代码问题
//        System.out.println("BookController.showBooks");
        List<BookVo> bookVoList = bookService.showBooks();
        return Result.success(bookVoList);
    }

    // /book/1  restful的传参
    // /book/getBookById?id=1 查询字符串传参
    @GetMapping("/{id}") // {} 模版参数
    public Result getBookById(@PathVariable Integer id) {
        // id就是{}模版的值 1 2
//        System.out.println("id = " + id);
        BookVo bookVo = bookService.getBookById(id);
        return Result.success(bookVo);
    }

}
/**
 * 1.三层架构
 * 2.统一响应Result curd统一返回的结构方便前端对接
 * msg 成功/失败原因
 * data 查询数据
 * 3.自定义异常、异常处理
 * 1.异常可能多有多个，而且每个方法都要手动捕获异常
 * 2.未知异常
 * 4.数据校验
 */

/*
   pojo : book 属性和表的字段一样
   vo: 响应
   dto: 接受
 */